from modele.Ressources import Ressources
from modele.Evenements import *


import math


class Vaisseau(object):
    def __init__(self,parent, x, y, id="default", classe="civil", type="default"):
        self.parent=parent
        self.x = x
        self.y = y
        self.etat = "rien" # pour s'avoir s'il attaque ou s'il est mort par exemple
        self.xArrivee = x
        self.yArrivee = y
        self.vitesse = 5
        self.idDestination="" # pour met id dictionaire du systeme s'il n'y pas de systeme valeur=""
        
        self.id = id
        self.type = type
        self.classe = classe
        self.ressourcesEntretien = Ressources(0)
        self.ressourcesEntretien.gaz = 0
        
        self.ressourcesPropulsion = Ressources(0)
        self.ressourcesPropulsion.gaz = 20
        
        self.ecouteurs = []

        #---combat---#
        '''
        il doit toujours y avoir un blindage par defaut. Le blindage differe
        selon le type de dommage des armes. par exemple, pour un blindage
        plus eleve contre les faisceaux laser, on creera un blindage
        blindage['laser'] = 2, par exemple.
        '''
        self.blindage = {}
        self.blindage['defaut'] = 1

        self.armes = {}
        self.armes[0] = [3, 'laser']
        #---fin combat ---#


    def valideArriveSysteme(self): 
        if self.x==self.xArrivee and self.y==self.yArrivee and self.parent.parent.systemes[self.idDestination]:
            print "here 1"
            return 1
        else:
            print "here 2"
            return 0 
        
    def deplacer(self):
        self.ressourcesPropulsion.consommer(self.ressourcesEntretien)
        if self.x != self.xArrivee or self.y != self.yArrivee:
            if self.ressourcesPropulsion.gaz >= 0:
                if self.xArrivee - self.x == 0:
                    if self.yArrivee - self.y < 0:
                        direction = -math.pi/2
                    else:
                        direction = math.pi/2
                else:
                    direction = math.atan((self.yArrivee - self.y)/(self.xArrivee - self.x))
                    if self.xArrivee - self.x < 0:
                        if direction > 0:
                            direction = -math.pi + direction
                        else:
                            direction = math.pi + direction

                #ensuite on calcule la nouvelle position
                newX = self.vitesse * math.cos(direction)
                newY = self.vitesse * math.sin(direction)

                #on verifie si on est arrive a destination
                #si oui, on place le vaisseau a la position d'arrivee (pour eviter de la depasser)
                #sinon on place le vaisseau a la nouvelle position
                xActuel = self.x
                self.x = self.x + int(newX)
                if self.xArrivee != xActuel:
                    if (self.xArrivee - xActuel)/math.fabs(self.xArrivee - xActuel) == 1:
                        if self.x > self.xArrivee:
                            self.x = self.xArrivee
                    elif (self.xArrivee - xActuel)/math.fabs(self.xArrivee - xActuel) == -1:
                        if self.x < self.xArrivee:
                            self.x = self.xArrivee

                yActuel = self.y
                self.y = self.y + int(newY)
                if self.yArrivee != yActuel:
                    if (self.yArrivee - yActuel)/math.fabs(self.yArrivee - yActuel) == 1:
                        if self.y > self.yArrivee:
                            self.y = self.yArrivee
                    elif (self.yArrivee - yActuel)/math.fabs(self.yArrivee - yActuel) == -1:
                        if self.y < self.yArrivee:
                            self.y = self.yArrivee

            else:
                #on genere un evenement car le vaisseau n'a plus suffisamment de ressources pour se deplacer
                self.genererEvent("Panne", "Ressources insuffisantes pour se deplacer")
        else: 
            for id in self.parent.parent.systemes:    
                if self.parent.parent.systemes[id].x == self.xArrivee and self.parent.parent.systemes[id].y == self.yArrivee:
                        self.idDestination=id
            if self.idDestination != "":       
                print "*****"
                print "test arrive "
                print self.idDestination
                self.parent.parent.systemes[self.idDestination].ajouterOwnerSysteme(self,self.parent)

    ''' GESTION DES EVENEMENTS '''
    #ajout des ecouteurs sur l'objet
    def addVaisseauListener(self, ecouteur):
        self.ecouteurs.append(ecouteur)
    
    #enlever des ecouteurs
    def removeVaisseauListener(self, ecouteur):
        self.ecouteurs.remove(ecouteur)
    
    #generation d'un evenement: on cree l'objet evenment, et on le passe a la liste d'ecouteurs inscrits
    #pour s'inscrire, un ecouteur DOIT IMPERATIVEMENT POSSEDER UNE METHODE vaisseauEvent(event)
    def genererEvent(self, type, message, code=0):
        ve = VaisseauEvent(self, type, message, code)
        for ecouteur in self.ecouteurs:
            ecouteur.vaisseauEvent(ve)
            
    def securiser(self):
        self.parent = self.parent.id

    def desecuriser(self, parent):
        self.parent = parent


'''    TEST    '''
#classe ecouteur de test         
class VaisseauEcouteur(object):
    def __init__(self):
        pass
    
    def vaisseauEvent(self, ve):
        print "le vaisseau est en panne a la position: ",
        print ve.source.x, ", ", ve.source.y

if __name__ == "__main__":
    vaisseau = Vaisseau(50, 50)
    vaisseau.xArrivee = 300

    ecouteur = VaisseauEcouteur()
    vaisseau.addVaisseauListener(ecouteur)
    
    for i in range(0,30):
        vaisseau.deplacer()
